﻿#include "pch.h"
#include "MainWindow.h"
#include "Resource.h"

BEGIN_MESSAGE_MAP(MainWindow, CDialog)
    ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStartClicked)
    ON_MESSAGE(Const::UM_GAME_OVER, OnGameOver)
END_MESSAGE_MAP()

/**
 * 构造方法。
 * @param parent    父窗口
 */
MainWindow::MainWindow(CWnd* parent) :
    CDialog(IDD_MAIN_WINDOW, parent),
    mGame(NULL),
    mGameBoard(Const::GAME_BOARD_WIDTH, Const::GAME_BOARD_HEIGHT) {
}

/**
 * 析构方法。
 */
MainWindow::~MainWindow() {
    delete mGame;
}

/**
 * "开始"按钮的单击响应方法。
 */
void MainWindow::OnButtonStartClicked() {
    CString text;
    text.LoadString(IDS_RESTART);
    CDialog::SetDlgItemText(IDC_BUTTON_START, text);

    mGame->Start();
}

/**
 * 游戏结束事件的响应方法。
 * @param isWon 胜利则为 TRUE，否则为 FALSE
 * @return 总是0
 */
LRESULT MainWindow::OnGameOver(WPARAM isWon, LPARAM) {
    if (isWon) {
        AfxMessageBox(IDS_WON, MB_ICONINFORMATION);
    } else {
        AfxMessageBox(IDS_LOST, MB_ICONINFORMATION);
    }

    CString text;
    text.LoadString(IDS_START);
    CDialog::SetDlgItemText(IDC_BUTTON_START, text);

    return 0;
}

/**
 * 初始化事件的响应方法。
 * @return 总是 TRUE
 */
BOOL MainWindow::OnInitDialog() {
    CDialog::OnInitDialog();

    // 创建游戏区域
    CRect gameBoardRect(Const::GAME_BOARD_X, Const::GAME_BOARD_Y,
        Const::GAME_BOARD_X + Const::GAME_BOARD_WIDTH, Const::GAME_BOARD_Y + Const::GAME_BOARD_HEIGHT);
    mGameBoard.Create(NULL, NULL, WS_CHILD | WS_VISIBLE, gameBoardRect, this, 0);

    // 创建游戏
    mGame = new Game(this, mGameBoard.GetDrawer(), &mGameBoard);

    return TRUE;
}

/**
 * 在翻译事件之前调用的方法。
 * @param msg   事件
 * @return 事件在此被处理则返回 TRUE，否则返回 FALSE
 */
BOOL MainWindow::PreTranslateMessage(MSG* msg) {
    if (msg->message == WM_KEYDOWN) {
        return mGame->OnKeyPressed((UINT)msg->wParam);
    }

    return CDialog::PreTranslateMessage(msg);
}
